UnityのMenuItemに罫線をつける、15分くらいの残念な歴史 ~完結編~


概要

自作プラグインのメニュー書いてました。


で、内容も纏め終わってて、出来る事も判ってきたので、えっと、

罫線<hr>これを、項目と項目の間に表示したかったわけです。



完成品

出来上がったものがこちらになります。

スクリーンショット 2013-03-05 21.11.59.png



このへんを参考にしたんです

http://docs.unity3d.com/Documentation/ScriptReference/MenuItem.MenuItem.html


大丈夫! 公式のサイトだよ!



B.C. 10分 可/不可、誕生

で、こんなコードを書いてました。

[MenuItem ("SublimeSocket/connect")]

static void Connect () {

}

[MenuItem ("SublimeSocket/connect", true)]

static bool IsConnectable () {

return false;

}



[MenuItem ("SublimeSocket/close")]

static void Close () {

}

[MenuItem ("SublimeSocket/close", true)]

static bool IsClosable () {

return false;

}


これで、

connect と close の2つの項目が、disabled状態で表示されるはずです。

こんなふうに。

スクリーンショット 2013-03-05 22.05.59.png


B.C. 0分 過ちのはじまり

まず、この修飾メソッドの使い方がアレだった。


[MenuItem ("SublimeSocket/connect")]

で、SublimeSocket 項目をメニューに表示、

クリックするとconnectとcloseが表示されますよ、と。

直下のメソッドは、connectとかが押されたときにfireされる。


で、じゃあすぐ下のペアはなんなの?っていうと、

パス部分の名前が一致する、すぐの修飾されたメソッド に対して、eneable/disableを設定する関数+修飾

なるほど。

違いは第二引数、true の存在。

[MenuItem ("SublimeSocket/connect", true)]

この値と一致する値を直下のメソッドが返す場合、その項目はenable

逆ならdisable


そういう仕様。

なるほど。へんなの。。。


A.C. 5分 そして罫線へ、、

で、とりあえず作ったわけですが、


けいせんほしい。

けいせんほしい。

priorityというパラメータがあるんだぜ、ってことで、まず調べる。


Separator in custom Editor MenuItem

http://answers.unity3d.com/questions/51906/separator-in-custom-editor-menuitem.html

ほう。

で、

こうしてみた。


[MenuItem ("SublimeSocket/connect")]

static void Connect () {

}

[MenuItem ("SublimeSocket/connect", true, 10)]

static bool IsConnectable () {

return false;

}



[MenuItem ("SublimeSocket/close")]

static void Close () {

}

[MenuItem ("SublimeSocket/close", true, 20)]

static bool IsClosable () {

return false;

}

1__#$!@%!#__スクリーンショット 2013-03-05 22.05.59.png

しーん、、、、


え。線が入らない。 値を変えても変わらない。 そんなアホな、、

priority値をどんなに変えてもだめ。  


いえね、罫線入れるとかはオプション側かなって思い込んじゃった。


過ちの始まりだった。



A.C. 10分 サルの惑星 ショート・ショート

じごくの はじまりだ!!

1stバッター・ハイフン

スクリーンショット 2013-03-05 20.47.25.png

うんうん、なんか切り取れそう





2ndバッター・アンダースコア


スクリーンショット 2013-03-05 21.01.06.png

ここで判明する、「同じ文字列で同じ長さ=同じ項目なので対消滅する」という

至極真っ当なルールが追い打ちをかける。

つまり長さが違う。 いやだ。。。。。



別の文字で同じ長さ、、そうだ!!




3rdバッター・オーバーライン

これだ! →‾‾‾‾‾‾‾‾‾‾‾‾‾   t‾wadaさんみたいな救世主だ!!


スクリーンショット 2013-03-05 21.03.57.png


もうね、腹抱えて笑った。


アホかと。さすが俺、アホかと。



A.C. 15分 ジャッジメント・デイ

ここで、4番が仕事をします。


[井上さん、できましたよ]

スクリーンショット 2013-03-05 22.47.05.png


俺「え。」


コードがこちら。


[MenuItem ("SublimeSocket/connect", false, 10)]

static void Connect () {

}

[MenuItem ("SublimeSocket/connect", true)]

static bool IsConnectable () {

return false;

}



[MenuItem ("SublimeSocket/close", false, 30)]

static void Close () {

}

[MenuItem ("SublimeSocket/close", true)]

static bool IsClosable () {

return false;

}


え。


オプションじゃないほうに入れんの。

引数足りないのに。


つまり第三引数に入れろと。


無理矢理第二引数を埋めて入れろと。


(えー、、、、、、、、)



声にならない声



出来上がったものがこちらになります。

1__#$!@%!#__スクリーンショット 2013-03-05 21.11.59.png



Undocumented information

罫線の発生条件は、

直前のpriorityとの差が11以上


11以上



ハイここテストに出すぞ。



priorityを1から始める場合、


[MenuItem ("SublimeSocket/connect", false, 1)]

static void Connect () {

}

[MenuItem ("SublimeSocket/connect", true)]

static bool IsConnectable () {

return false;

}



[MenuItem ("SublimeSocket/disconnect", false, 2)]

static void Close () {

}

[MenuItem ("SublimeSocket/disconnect", true)]

static bool IsClosable () {

return false;

}



// reload

[MenuItem ("SublimeSocket/reload", false, 13)]

static void Reload () {

}

[MenuItem ("SublimeSocket/reload", true)]

static bool IsReloadable () {

return false;

}



[MenuItem ("SublimeSocket/autoConnect-on", false, 24)]

static void TurnAutoOn () {

}

[MenuItem ("SublimeSocket/autoConnect-on", true)]

static bool IsTurnableAutoToOn () {

return true;

}


みたいになる。

たぶん、罫線出る == (10 < distance) とか書いちゃったんじゃねーかなー。 



次回予告

チェック∨ を探す旅に出ます。

こういうのです。


スクリーンショット 2013-03-05 22.13.01.png



正直、














むりっぽい気がしています。













からの、








不明.png

nakamura001

@toru_inoue チェック付けるのはPrime31ですらこんな実装なので結構難易度高いんじゃないかと見てます http://t.co/qM1cWOSomL















、、、、、、


、、、、


、、



よし!!









打ち切りました。

俺さんの次回作にご期待ください。